package basics

import java.lang.StringBuilder

fun main(){
    val str = "hello"+"world"
    //println(str.length)
    //println(str.get(0))
    //println(str.subSequence(0,4))

    /**
     * > 0  str1 > str2
     * = 0  str1 == str2
     * < 0  str1 < str2
     */
    //val result = name2.compareTo(name2)
    //println(result)

//    val name1 = "ad"
//    val name2 = String(charArrayOf('a','d'))
//    if (name1.equals(name2)){
//        println("equal")
//    }else{
//        println("not equal")
//    }

//    val p1 = Person()
//    println(p1)
//    val name = "jack"
//    name.last()
//    name.get(name.length-1)
//
//    Person().also {
//        it.score = 10f
//        println(it.score)
//
//        it.eat()
//    }

    //elementAt()
    val testStr = "helloworld"
    //safeAccess { testStr.elementAt(20) }
    //safeAccess { testStr.take(20) }

    //elementAtOrElse
//    testStr.elementAtOrElse(2){
//        'a'
//    }.also {
//        println(it)
//    }

    //helloworld
    //find 找到字符串中第一个满足条件的字符
    //findLast 找到最后一个满足条件的字符
//    testStr.findLast{
//        it < 'h'
//    }.also { println(it) }

    //first()第一个字符  last()
//    testStr.first {
//        it < 'h'
//    }

    //get()
    //getOrElse() 如果越界必须提供一个默认的结果字符

//    testStr.indexOfFirst {
//        it == 'l'
//    }.also {
//        println(it)
//    }

    //random() 从字符串中随机获取一个字符
    //testStr.random().also { println(it) }

    //Returns a subsequence of this char sequence
    // with the first n characters removed.
    //删除前面n个字符之后的子字符串
    //注意并没有将原始数据改变
    //只是将原始数据copy一份出来 移除前面n个 得到新的字字符串
//    testStr.drop(5).also { println(it) }
//    println(testStr)

    //filter 过滤出满足条件的所有字符 得到一个字符串
//    testStr.filter {
//        it > 'h'
//    }.also { println(it) }
//    testStr.filterIndexed { index, c ->
//        (index+1) % 2 == 0
//    }.also { println(it) }

    //slice()获取子序列
    //testStr.slice(IntRange(0,4)).also { println(it) }

    //take(n) 获取前n个字符的字符串
    //show{ testStr.take(5) }
    //show{ testStr.takeLast(5) }
    //helloworld
    //找到第一个不满足条件的位置 取出前面满足的所有字符串
//    show{ testStr.takeWhile {
//        it < 'w'
//    }}

    //reversed 翻转
    //show { testStr.reversed() }

    //show { testStr.toList() }

    //helloworld
    //ifmmpxpsme
    //对每个字符进行操作 然后得到新的集合
//    show { testStr.map {
//        it+1
//    } }

    //count()

//    str.endsWith()

//    val s = "hello       "
//    print(s.trim())
//    println(s)

//    testStr.uppercase()
//    testStr.lowercase()

//    val s1 = Student()
//    val s2 = Student()
//    s1.compareTo(s2)

    val s1 = "a"
    val s2 = s1 + "b"


    val sb = StringBuilder()
    sb.append("hello")
    sb.append(" ")
    sb.append("world")

    sb.delete(0,1)

    sb.insert(1,"jack")

    //获取字符串
    sb.toString()

    println(sb)
}

class Student: Comparable<Student>{
    val score = 20
    override fun compareTo(other: Student): Int {
        return this.score - other.score
    }
}

fun<T> show(acton:()->T){
    acton().also { println(it) }
}

fun safeAccess(action:()->Unit){
    try {
        action()
    }catch (e:Exception){
        e.printStackTrace()
    }
}
/**
 * 扩展函数
 * 在已有类的基础上添加一些新的功能
 * 在扩展函数中如何调用对象本身
 */
fun Person.eat(){
    println("扩展的函数 ${this.name} ${this.age}")
}

/**
 * 扩展属性
 * 扩展类
 * Extension property cannot be initialized because it has no backing field
 * 扩展属性没有field字段，不能存值
 * 扩展属性知识给这个属性添加了一个set和get方法
 * 用得比较少 -> 没办法存值
 */
var Person.score:Float
    set(value) {
        println(value)
    }
    get() {
        return 100f
    }

class MyPerson: Person(){
    val score = 96f
}



class MyPerson2: Person(){
    fun eat(){

    }
}

class MyPerson3: Person(){
    var address = "西南大学"
        set(value) {
            field = value
        }
        get() {
            return field
        }
    fun work(){

    }
}
open class Person{
    val name:String = "jack"
    val age:Int = 10

    /**
     * 重写父类的toString方法
     * 当使用输出语句打印这个对象时
     * 就会调用这个对象的toString方法
     * 如果没有重写，就会调用系统默认的实现
     * 类名@HashCode
     * 如果不希望按照系统的方式打印对象
     * 就需要重写这个方法
     * 用于调试
     */
    override fun toString(): String {
        return "$name-$age"
    }
}



/**
 *  find
 *  reversed
 *  plus
 *  map
 *  take()
 *  takeLast()
 *  elementAtOrElse
 *  takeWhile
 *  filter
 *  str.subSequence(0,3)
 *  toList
 *  toString()
 *  equals()
 *  indexOf
 *  compareTo
 *  elementAt
 *  first()
 *  first{}
 *  drop()
 *  count()
 *  length
 *  slice()
 *  random()
 *  trim()
 */

















